package org.dromara.demo.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.websocket.dto.WebSocketMessageDto;
import org.dromara.common.websocket.utils.WebSocketUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：WebSocket 演示案例
 */
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/websocket")
@Slf4j
public class WeSocketController {

    /**
     * 发布消息
     * 此方法利用WebSocket技术发送消息，通过WebSocketUtils工具类的publishMessage方法实现消息的发布。
     * 它不直接操作WebSocket连接，而是调用工具方法完成消息的发送，这使得代码更加模块化和易于维护。
     * 方法返回一个R对象，其中包含操作结果和成功与否的信息，这是典型的RPC（远程过程调用）风格的返回方式。
     *
     * @param dto 发送内容 WebSocket消息数据传输对象，包含要发送的消息内容及目标接收者信息
     * @return R<Void> 对操作结果的封装，表示消息是否发送成功
     * @throws InterruptedException 如果线程在等待过程中被中断，将抛出此异常
     */
    @GetMapping("/send")
    public R<Void> send(WebSocketMessageDto dto) throws InterruptedException {
        // 发布WebSocket消息
        WebSocketUtils.publishMessage(dto);
        return R.ok("操作成功");
    }
}
